grammar SA;

fragment    DIGIT   :   [0-9]       ;
fragment    ALPHA   :   [a-zA-Z_]   ;
fragment    HEX     :   [0-9a-fA-F] ;
fragment    E       :   ('E' | 'e') ;
fragment    S       :   ('+' | '-') ;
fragment    CHAR    :   ('\\"'|'\\\\'|.);

// 除换行外的空白要去掉
SPACE       :   (' ' | '\t' | '\r')+    -> skip ;

// 关键字
HEADER      :   'HEADER'    ;
TYPE        :   'TYPE'      ;
SWEEP       :   'SWEEP'     ;
TRACE       :   'TRACE'     ;
VALUE       :   'VALUE'     ;
END         :   'END'       ;
BOOL        :   'BOOL'      ;
INT         :   'INT'       ;
FLOAT       :   'FLOAT'     ;
COMPLEX     :   'COMPLEX'   ;
STRING      :   'STRING'    ;
ARRAY       :   'ARRAY'     ;
STRUCT      :   'STRUCT'    ;
BYTE        :   'BYTE'      ;
SHORT       :   'SHORT'     ;
LONG        :   'LONG'      ;
DOUBLE      :   'DOUBLE'    ;
PROP        :   'PROP'      ;
GROUP       :   'GROUP'     ;
EOL         :   '\n' +      ;

// 字面量
LITERAL_BOOL    :   ('yes' | 'no')  ;
LITERAL_STRING  :   '"' CHAR*? '"'  ;
LITERAL_INTEGER :   S? (DIGIT+ | 'nan' | 'inf')  ;
LITERAL_FLOAT   :   S? DIGIT* '.' DIGIT+ (E S? DIGIT+)? // 带点，只有后缀
                |   S? DIGIT+ '.' DIGIT* (E S? DIGIT+)? // 带点，只有前缀
                |   S? DIGIT+ E S? DIGIT+               // 不带点
                ;

// 总入口
sa_file   :   header_section (type_section)? (sweep_section)? (trace_section)? (value_section)?  END ;

// 各种段的基本结构定义
header_section  :   HEADER  (EOL header_item   )+  EOL;
type_section    :   TYPE    (EOL type_item     )+  EOL;
sweep_section   :   SWEEP   (EOL sweep_item    )+  EOL;
trace_section   :   TRACE   (EOL trace_item    )+  EOL;
value_section   :   VALUE   (EOL value_item    )+  EOL;

// 段的基本组成：各种不同的项
header_item     :   name value           ;  // header_item 自身就是一种属性的结构
type_item       :   name type  (prop)?   ;
sweep_item      :   name name  (prop)?   ;
trace_item      :   name name  (prop)?                          # trace_item_normal     //  定义一个信号
                |   LITERAL_STRING GROUP LITERAL_INTEGER        # trace_item_group      //  定义一组信号
                ;
value_item      :   name value EOL value (EOL value)* (prop)?   # value_item_group
                |   name reftype value      (prop)?             # value_item_ref        //  reftype 主要在 dc 场景会用到
                |   name value              (prop)?             # value_item_normal
                ;

// 描述数据类型的语法
type        :   INT     kind_refined                        # type_int
            |   FLOAT   kind_refined                        # type_float
            |   COMPLEX kind_refined                        # type_complex
            |   STRING '*'                                  # type_string
            |   ARRAY  '(' '*' ')' type                     # type_array
            |   STRUCT '(' EOL (member EOL)*  ')'           # type_struct
            ;

kind_refined    :   (BYTE | SHORT | LONG | DOUBLE)   ;


member          :   name type (prop)?   ;

//  描述数据属性的语法
prop        :   PROP '(' (EOL name value)* EOL ')'    ;

//  基本要素
reftype     :   LITERAL_STRING  ;
name        :   LITERAL_STRING  ;
value       :   LITERAL_BOOL                            # value_bool
            |   LITERAL_STRING                          # value_string
            |   LITERAL_INTEGER                         # value_integer
            |   LITERAL_FLOAT                           # value_float
            |   '(' (value EOL?)* ')'                   # value_group       //  STRUCT/ARRAY/COMPLEX 形式
            ;
